package shopping;

import shopping.enetity.User;

import java.io.*;

public class TestObjectStream {
    public static void main(String[] args) throws IOException, ClassNotFoundException {

        //创建一个用户
        User user = new User("u00001","张三","123456","管理员",'男',"大同");

        //创建一个文件
        File f = new File("E:\\java_new\\java_code\\J2024_12_10\\src\\User.txt");

        //创建一根字节输入流管道 - 这是一根细的管道
        FileOutputStream fos = new FileOutputStream(f,true);

        //创建一根对象输入流管道 - 这是一根粗管道
        ObjectOutputStream oos = new ObjectOutputStream(fos);

        //打开水龙头 调用writeObject方法
        oos.writeObject(user);//注意： 这里直接传入user对象即可 不用再toString

        //关闭管道
        //关闭时候先关粗的，再关细的
        if (oos != null) {
            oos.close();
        }
        if (fos != null) {
            fos.close();
        }
        //如果此时运行程序 那么会发现报出 NotSerializableException异常
        //没有序列化 ObjectOutputStream的对象必须的序列化的
        //不能再直接使用BufferedStream和charStream的User
        //应该加一点小改动
        //给User类加一个Serializable接口 即可正常运行

        /************************************************************************/

        //从文件中读出用户信息

        //创建一根字节输出管道 - 这是一根细管道
        FileInputStream fis = new FileInputStream(f);

        //创建一根对象输出管道 - 这是一根粗管道
        ObjectInputStream ois = new ObjectInputStream(fis);

        //打开水龙头
        //此时要读出的是一个用户
        User user1 = null;
        //available方法 返回 int 类型 返回用户后面还有的字节数
        while (fis.available() > 0) {//注意这里是fis调用available方法
//            u = ois.readObject();//Object -> User  向下转型 err 需要强制类型转换
            user1 = (User)ois.readObject();

            //打印到控制台
            System.out.println(user1);

            //若想实现追加打印 则需要鼠标指针每次打印后跳过四个字节 跳过AC
            fis.skip(4);
        }

        if (fis != null) {
            fis.close();
        }
        if (ois != null) {
            ois.close();
        }
    }
}
